/**
 * 日期格式化工具类
 * 用于替代dayjs库，提供基本的日期格式化功能
 */

/**
 * 格式化日期
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @param {string} format 格式化模式，例如 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!date) return '';
  
  // 转换输入的日期为Date对象
  const dateObj = typeof date === 'object' ? date : new Date(date);
  
  // 如果日期无效，返回空字符串
  if (isNaN(dateObj.getTime())) return '';
  
  const year = dateObj.getFullYear();
  const month = dateObj.getMonth() + 1;
  const day = dateObj.getDate();
  const hours = dateObj.getHours();
  const minutes = dateObj.getMinutes();
  const seconds = dateObj.getSeconds();
  
  // 替换格式字符串中的占位符
  return format
    .replace(/YYYY/g, year)
    .replace(/YY/g, String(year).slice(-2))
    .replace(/MM/g, padZero(month))
    .replace(/M/g, month)
    .replace(/DD/g, padZero(day))
    .replace(/D/g, day)
    .replace(/HH/g, padZero(hours))
    .replace(/H/g, hours)
    .replace(/mm/g, padZero(minutes))
    .replace(/m/g, minutes)
    .replace(/ss/g, padZero(seconds))
    .replace(/s/g, seconds);
}

/**
 * 格式化日期为后端所需的格式 (yyyy-MM-dd HH:mm:ss)
 * 专门用于与后端API交互时的日期格式化
 * 
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @returns {string|null} 格式化后的日期字符串，如果输入无效则返回null
 */
export function formatDateForBackend(date) {
  if (!date) return null;
  
  // 转换输入的日期为Date对象
  let dateObj;
  
  if (typeof date === 'object' && date instanceof Date) {
    dateObj = date;
  } else if (typeof date === 'number') {
    dateObj = new Date(date);
  } else if (typeof date === 'string') {
    // 尝试解析日期字符串
    dateObj = new Date(date);
  } else {
    return null; // 无法识别的类型
  }
  
  // 如果日期无效，返回null
  if (isNaN(dateObj.getTime())) return null;
  
  // 按照后端期望的格式 yyyy-MM-dd HH:mm:ss 进行格式化
  const year = dateObj.getFullYear();
  const month = padZero(dateObj.getMonth() + 1);
  const day = padZero(dateObj.getDate());
  const hours = padZero(dateObj.getHours());
  const minutes = padZero(dateObj.getMinutes());
  const seconds = padZero(dateObj.getSeconds());
  
  // 返回格式化后的字符串
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

/**
 * 格式化相对时间
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @returns {string} 相对时间字符串，如"今天 12:30"、"昨天 12:30"、"2023-05-01"
 */
export function formatRelativeTime(date) {
  if (!date) return '';
  
  // 转换输入的日期为Date对象
  const dateObj = typeof date === 'object' ? date : new Date(date);
  
  // 如果日期无效，返回空字符串
  if (isNaN(dateObj.getTime())) return '';
  
  const now = new Date();
  const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
  const yesterday = new Date(today);
  yesterday.setDate(yesterday.getDate() - 1);
  const tomorrow = new Date(today);
  tomorrow.setDate(tomorrow.getDate() + 1);
  
  // 格式化时间部分
  const timeStr = `${padZero(dateObj.getHours())}:${padZero(dateObj.getMinutes())}`;
  
  // 判断是今天、昨天、明天还是其他日期
  if (dateObj >= today && dateObj < tomorrow) {
    return `今天 ${timeStr}`;
  } else if (dateObj >= yesterday && dateObj < today) {
    return `昨天 ${timeStr}`;
  } else if (dateObj >= tomorrow && dateObj < new Date(tomorrow.getTime() + 86400000)) {
    return `明天 ${timeStr}`;
  } else {
    return formatDate(dateObj, 'YYYY-MM-DD');
  }
}

/**
 * 格式化截止时间
 * @param {Date|string|number} deadline 截止时间
 * @returns {string} 格式化后的截止时间字符串
 */
export function formatDeadline(deadline) {
  if (!deadline) return '无截止日期';
  
  const dateObj = typeof deadline === 'object' ? deadline : new Date(deadline);
  if (isNaN(dateObj.getTime())) return '无截止日期';
  
  const now = new Date();
  const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
  const tomorrow = new Date(today);
  tomorrow.setDate(tomorrow.getDate() + 1);
  
  // 格式化时间部分
  const timeStr = `${padZero(dateObj.getHours())}:${padZero(dateObj.getMinutes())}`;
  
  // 判断是今天、明天还是其他日期
  if (dateObj < now) {
    return `已过期 ${formatDate(dateObj, 'MM-DD HH:mm')}`;
  } else if (dateObj >= today && dateObj < tomorrow) {
    return `今天 ${timeStr}`;
  } else if (dateObj >= tomorrow && dateObj < new Date(tomorrow.getTime() + 86400000)) {
    return `明天 ${timeStr}`;
  } else {
    return formatDate(dateObj, 'MM-DD HH:mm');
  }
}

/**
 * 数字补零
 * @param {number} num 需要补零的数字
 * @returns {string} 补零后的字符串
 */
function padZero(num) {
  return String(num).padStart(2, '0');
}

export default {
  formatDate,
  formatDateForBackend,
  formatRelativeTime,
  formatDeadline
}; 